package spring.mvc.controller;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import spring.mvc.domain.Member;

/*
 - Controller(Handler) 메소드 선언
 1. 접근제한자 : public 
 2. return type
 	- String : View Name 만 리턴
 	- ModelAndView : Model-응답데이터, View : ViewName
 	- Model/ModelMap/Map , Domain Object (응답 데이터를 return)
 	- void
 	- View 타입
 3. 매개변수 (모두 선택사항(개수상관없다), 순서 상관없다.)
 	- HttpServletRequest / HttpServletResponse
 	- HttpSession : 
 		요청한 클라이언트와 연결된 Session객체가 있으면 그 객체를 대입, 없으면 새로 만들어 대입해 준다.
 		무조건 Session객체가 참조되는 것을 보장한다.
 	- Model || ModelMap || Map
 	- 요청파라미터를 받을 수 있는 변수
 		- @RequestParam 선언 변수 - 요청파라미터 1개-하나의 변수(리터럴)
 		- @ModelAttribute 선언 변수 - 요청파라미터들 - Domain Object(여러개 요청파라미터 받을경우)
 */
@Controller
@RequestMapping("/member/")
public class MemberController {
	//로인인 폼으로 수행을 넘기는 controller
	@RequestMapping(value="login.do", method=RequestMethod.GET)
	public String loginForm(){
		return "/member/login_form.jsp";//View 이름
	}
	
	//로그인 처리
	//매개변수 - 요청파라미터를 받을 변수 선언. 변수명과 요청파라미터 명 연결해서 값이 대입된다.
	//매개변수의 이름고 요청파라미터의 이름이 다른 경우 @RequestParam 을 이용해 설정.
	@RequestMapping(value="login.do", method=RequestMethod.POST)
	public String login(String id, String password, HttpSession session){
		System.out.println("로그인 정보 : "+id+" - "+password);
		//Model호출 - 로그인처리
		//로그인 여부 체크용 attribute를 session에 binding - Attribute:Member객체
		session.setAttribute("login_member", new Member(id,password, "이철수", 30));
		return "/member/login_success.jsp";
	}
	
	//가입 폼을 리턴하는 handler 메소드
	@RequestMapping(value="join.do", method=RequestMethod.GET)
	public String joinForm(){
		System.out.println("joinForm() 실행");
		return "/member/join_form.jsp";
	}
	//가입 처리 handler 메소드
//	@ModelAttribute 선언 변수 - 요청파라미터들 - Domain Object
//	Domain Object를 requestScope의 attribute로 binding 해준다.
//	attribute이름 - class이름(첫글자 소문자) : member - attribute객체 : 요청파라미터를 담은 DO
//	attribute이름을 명시할 경우 변수 앞에 @ModelAttribute("attribute이름") 으로 설정
	@RequestMapping(value="join.do", method=RequestMethod.POST)
	public String join(@ModelAttribute Member member){
		System.out.println("등록 처리 : "+member);
		return "/member/join_success.jsp";
	}
	/*
	@RequestMapping("searchMemberById.do")
	public ModelAndView searchMemberById(String id){
		//BL - 조회
		Member result = new Member(id, "1212", "최영이", 20);
		//search_result.jsp
		return new ModelAndView("/member/search_result.jsp", "result", result);
	}
	*/
	@RequestMapping("searchMemberById.do")
	public String searchMemberById(String id, ModelMap map){
		//BL - 조회
		Member result = new Member(id, "1212", "최영이", 20);
		//search_result.jsp
		map.addAttribute("result", result);
//		map.put("result", result); //put으로 binding 가능
		return "/member/search_result.jsp";
	}
	@RequestMapping("/mainPage.do")
	public String mainPage(){
		return "index";
	}
	
	//Ajax 요청 처리 Controller ->View단 처리가 일반 controller메소드와 차이.
	@RequestMapping("searchMemberById_ajax.do")
	public String searchMemberByIdAjax(String id, ModelMap map){
		//BL - 조회
		Member result = new Member(id, "1212", "최영이", 20);
		map.addAttribute("result", result);
		//JSONView - {"result":{id:"id-20","name":"최영이"..}}
		return "jsonView";
	}
	/*
	 @ResponseBody 
	 	- controller 메소드가 return 하는 값을 HTTP 응답 body에 넣어 클라이언트에 출력하도록 처리.
	 	- return 하는 데이터의 종류에 따라 응답 메세지(데이터) 형태로 변환이 필요하다. 
	 		-> MessageConverter가 변환 작업 처리.
	 		-> 변환 형태에 맞는 MessageConverter의 빈을 등록한 뒤 HandlerAdapter의 프라퍼티로 
	 		     주입해 주어야 한다.
	 		->Member(DO)객체 -> JSON 문자열 : MappingJacksonHttpMessageConverter
	 */
	@RequestMapping("searchMemberById_ajax2.do")
	@ResponseBody
	public Member searchMemberByIdAjax2(String id){
		//처리결과
		return new Member(id, "pwd-111", "김철수", 38);
		//{id:"id-1",password:"pwd-111", name:"김철수", age:38}
	
	}
	
}












